#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <signal.h>
#include <string.h>

void handler(int signo)
{
  while(1)
  {
    printf("get a signo: %d\n", signo);
    sleep(1);
  }
}

int main()
{
  struct sigaction act;
  memset(&act, 0, sizeof(act));

  //act.sa_handler = SIG_IGN;//忽略
  //act.sa_handler = SIG_DFL;//默认
  act.sa_handler = handler;//自定义
  
  //可以屏蔽掉act.sa_mask里面的信号
  sigemptyset(&act.sa_mask);
  sigaddset(&act.sa_mask, 3);
  //修改当前进程的handler函数指针数字的特定内容
  sigaction(2, &act, NULL);
  while(1)
  {
    printf("hello world\n");
    sleep(1);
  }
  return 0;
}

//void show_pending(sigset_t* set)
//{
//  printf("cur process pending:");
//  int i = 1;
//  for(; i < 32; ++i)
//  {
//    if(sigismember(set, i))//该信号是否被设置
//    {
//      printf("1");
//    }
//    else 
//    {
//      printf("0");
//    }
//  }
//  printf("\n");
//
//}
//
//void handler(int signal)
//{
//  printf("自定义捕捉2号信号， 2号信号已经被递达了\n");
//  exit(1);
//}
//
//int main()
//{
//  //虽然sigset_t是一个位图结构，但是不同的OS实现是不一样的，不能让用户修改该变量
//  //需要使用特定的函数
// // sigset_t set ;
//  //set |= 1;//报错
//  signal(2, handler);//自定义捕捉2号信号
//
//  sigset_t set;
//  sigset_t oset;
//
//  sigemptyset(&set);//位图置空
//  sigemptyset(&oset);//位图置空
//
//  sigaddset(&set, 2);//添加2号信号到位图
//  //sigaddset(&set, 9);//添加9号信号到位图
//
//  sigprocmask(SIG_SETMASK, &set, &oset);//通过set修改信号屏蔽字
//  sigset_t pending;
//  int count = 0;
//  while(1)
//  {
//    sigemptyset(&pending);
//
//    sigpending(&pending);
//
//    show_pending(&pending);
//    count++;
//    //10秒过会就会执行恢复屏蔽字
//    if(count == 10)
//    {
//      sigprocmask(SIG_SETMASK, &oset, NULL);//恢复屏蔽字
//      printf("恢复2号信号， 可以被递达了\n");//恢复2号信号2，默认处理方式是终止进程，所以我们可以对它自定义捕捉
//    }
//    sleep(1);
//  }
//
//  return 0;
//}
